#include<stdio.h>
#include<stdlib.h>
#include<string.h>




typedef struct stu
{
    char name[128];
    char sex[50];
    int age;
    int soc;
}stu;

stu mess[10] = 
{
    {.name = "石昊", .sex="男", .age = 18, .soc = 96},
    {.name = "磊哥", .sex="男", .age = 19, .soc = 99},
    {.name = "狠人", .sex="男", .age = 20, .soc = 98},
    {.name = "萧炎", .sex="男", .age = 21, .soc = 97},
};

stu * myrealloc(stu **D,size_t newsize,size_t oldsize);


int main(int argc, char const *argv[])
{
    stu * D = (stu *)malloc(10 * sizeof(stu));
    if (NULL == D)
    {
        printf("创建失败\n");
        return -1;
    }
    // 数据写入
    for (size_t i = 0; i < 4; i++)
    {
        D[i] = mess[i];
    }
    
    printf("%p\n",D);
    D = myrealloc( &D , 5 , 10);

    free(D);
    return 0;
}

stu * myrealloc(stu **D,size_t newsize,size_t oldsize)
{
    printf("%p\n",*D);
    printf("%s\n",(*D)[1].name);
    if (0 == newsize)
    {
        free(*D);
        *D = NULL;
        return NULL;
    }
    // *D 为 NULL
    if (NULL == *D)
    {
        printf("输入的 D 为 NULL , 创建失败\n");
        return NULL;
    }

    if (newsize < oldsize)
    {
        printf("新内存空间比原内存 小 请问是否继续执行(是:1 否:0)\n");
        int ch = 0;
        scanf("%d" , &ch);
        if (0 == ch)
        {
            return NULL;
        }
    }
    
    // 1、 创建一个新的动态空间 <需要的大小>

    stu * D1 = (stu *)malloc(newsize * sizeof(stu));
    if (NULL == D1)
    {
        printf("创建失败\n");
        return NULL;
    }
    
    // 2、 拷贝原本的数据
    for (size_t i = 0; i < newsize; i++)
    {
        D1[i] = (*D)[i];
    }

    // 3、释放原来的空间
    free(*D);
    *D = NULL;

    // 4、返回新空间
    return D1;
}
// main  D
// 数据 0x602010
// 地址 0x7fffffffe130

// myrealloc D
// 不解 数据 0x7fffffffe130
// 一解 数据 0x602010